﻿using Parylene_CVD.Commands;
using Parylene_CVD.DAL;
using Parylene_CVD.Model;
using Parylene_CVD.Model.DModels;
using Parylene_CVD.Service;
using Parylene_CVD.Tools;
using Parylene_CVD.Views;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace Parylene_CVD.ViewModel
{
    public class AddUserViewModel : ViewModelBase
    {
        public AddUserViewModel(NavigationService UserManagementViewNavigationService) {
            BackCommand = new NavigateCommand(UserManagementViewNavigationService);
            SaveCommand = new RelayCommand(Save);
            // 初始化数据源
            Locales = new ObservableCollection<string> { GlobalVariables.AdminTitle, GlobalVariables.SupervisorTitle, GlobalVariables.OperatorTitle };
        }
        public ICommand BackCommand { get; }
        public ICommand SaveCommand { get; }
        private void Save(object parameter)
        {
            // 清空错误信息
            StringBuilder errors = new StringBuilder();

            // 必填项校验
            if (string.IsNullOrWhiteSpace(Username))
            {
                errors.AppendLine("用户名不能为空。");
            }

            if (string.IsNullOrWhiteSpace(Password))
            {
                errors.AppendLine("密码不能为空。");
            }

            if (string.IsNullOrWhiteSpace(SelectedLocale))
            {
                errors.AppendLine("请选择一个职位。");
            }

            // 长度校验
            if (!string.IsNullOrWhiteSpace(Username) && Username.Length < 3)
            {
                errors.AppendLine("用户名长度必须大于等于3个字符。");
            }

            if (!string.IsNullOrWhiteSpace(Password) && Password.Length < 6)
            {
                errors.AppendLine("密码长度必须大于等于6个字符。");
            }
            // 校验密码中是否包含汉字
            if (!string.IsNullOrWhiteSpace(Password) && Password.Any(c => c >= 0x4e00 && c <= 0x9fa5))  // Unicode 范围内的汉字
            {
                errors.AppendLine("密码不能包含汉字。");
            }

            // 密码复杂度校验（至少包含字母和数字）
            //if (!string.IsNullOrWhiteSpace(Password) &&
            //    (!Password.Any(char.IsLetter) || !Password.Any(char.IsDigit)))
            //{
            //    errors.AppendLine("密码必须包含至少一个字母和一个数字。");
            //}



            // 如果有错误，抛出异常或显示提示
            if (errors.Length > 0)
            {
                // 使用异常
                // throw new InvalidOperationException(errors.ToString());

                // 或者显示消息框（需要引用 System.Windows）
                MessageBox.Show(errors.ToString(), "输入错误", MessageBoxButton.OK, MessageBoxImage.Warning);

                // 直接返回，阻止保存
                return;
            }

            // 如果所有校验通过，调用保存方法
            try
            {
                // 数据保存的逻辑交给数据库实现
                SaveToDatabase();
                // 提示成功（可选）
                MessageBox.Show("用户保存成功！", "成功", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            catch (Exception ex)
            {
                // 检查异常消息是否包含 UNIQUE KEY
                if (ex.Message.Contains("UNIQUE KEY", StringComparison.OrdinalIgnoreCase))
                {
                    MessageBox.Show("保存用户失败：账号不能重复", "错误", MessageBoxButton.OK, MessageBoxImage.Warning);
                }
                else
                {
                    MessageBox.Show($"保存用户失败：请联系技术人员。\n错误信息：{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                // 可以根据需要决定是否继续抛出异常
                // throw new InvalidOperationException("保存用户失败。", ex);
            }

        }

        private void SaveToDatabase()
        {
            string pd = PasswordEncryption.Encrypt(Password);
            User user = new User(Username,pd, SelectedLocale,DateTime.Now,DateTime.Now);
            UserDAL userDAL = new UserDAL();
            userDAL.Add(user, "", 0);
        }


        // 用户名
        private string _username;
        public string Username
        {
            get => _username;
            set
            {
                _username = value;
                OnPropertyChanged(nameof(Username));
            }
        }

        // 密码
        private string _password;
        public string Password
        {
            get => _password;
            set
            {
                _password = value;
                OnPropertyChanged(nameof(Password));
            }
        }
        
        //职位复选框列表
        private ObservableCollection<string> _locales;
        
        public ObservableCollection<string> Locales
        {
            get => _locales;
            set
            {
                _locales = value;
                OnPropertyChanged(nameof(Locales));
            }
        }
        //选中职位
        private string _selectedLocale;
        public string SelectedLocale
        {
            get => _selectedLocale;
            set
            {
                _selectedLocale = value;
                OnPropertyChanged(nameof(SelectedLocale));
            }
        }

    }
}
